package com.moyuwanjia.utils;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * @author 摸鱼丸加~
 * @create 2022-07-08 16:57
 * 连接数据库的工具类，用于从数据源中获取一个连接，并且实现与线程绑定
 *
 */
public class ConnectionUtils {
    //创建本地线程变量管理数据库连接
    private ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
    private DataSource dataSource;

    public void setDataSource(DataSource dataSource){
        this.dataSource = dataSource;
    }

    /**
     * 获取当前线程中的连接
     * @return
     */
    public Connection getThreadConnection(){
        //1.先从ThreadLocal上获取连接
        Connection connection = threadLocal.get();
        //2.判断当前线程上是否存在连接
        if(null==connection){
            //3.如果不存在则获取连接，并且存入ThreadLocal中
            try {
                connection = dataSource.getConnection();
            } catch (SQLException sqlException) {
                sqlException.printStackTrace();
            }
            threadLocal.set(connection);
        }
        return  connection;
    }

    /**
     *    连接的关闭不是直接关闭，而是将连接还回连接池中，同样线程也是同样操作，还回线程池中，
     * 但是此时还回线程池中的线程还在绑着连接，只不过这个连接被关闭了，而此时如果再次获取连接
     * 这个连接是存在的，但是已经不能用了，所以此时我们需要做一个解绑操作，当然如果是在一个
     * 普通的java工程中是不会涉及这个问题的，但是如果是一个web工程，就会涉及到这个问题
     *
     * 该方法的作用就是把线程和连接解绑(close方法)
     */
    public void removeConnection(){
        threadLocal.remove();
    }






}
